home *** CD-ROM | disk | FTP | other *** search
/ PC/CD Gamer UK 133 / CD_Gamer_Issue_133_Disc_1_PCGA1330304_March_2004.iso / Intro.dxr / 00008_Push Button.ls < prev    next >
Encoding:
Text File  |  2004-01-29  |  12.4 KB  |  300 lines

  1. property spriteNum, mySprite, myMember, myStandardMember, myRollovermember, myMouseDownMember, myDisabledMember, myMouseDownSound, myMouseUpSound, myActiveFlag, myXRayFlag, myMessageType, myMessage, theMouseWasUp, myMouseDown, myRollover, mySubscribersList
  2.  
  3. on getBehaviorDescription me
  4.   return "PUSH BUTTON" & RETURN & RETURN & "This behavior sets the member of a sprite depending on the state of the mouse (elsewhere, rollover, mouseDown, mouseUp)." & RETURN & RETURN & "This creates a button which can either initiate actions in other sprites, or provide visual feedback for other behaviors attached to the same sprite." & RETURN & RETURN & "The behavior can be enabled or disabled, using a #PushButton_ToggleActive call to the behavior or the sprite." & RETURN & RETURN & "Two messaging systems are provided:" & RETURN & "1) A custom message can sent whenever the Push Button behavior is activated. " & "This message can be sent to a Movie Script handler, all sprites, or the actorList. " & "The message can also be suppressed." & RETURN & RETURN & "2) Objects can 'subscribe' to the behavior in order to receive PushButton_Activated, _Enabled and _Disabled messages. " & "A two-way messaging system allows for cleaning up object references before an object is destroyed." & RETURN & RETURN & "The behavior can be set to consider that all sprites in higher channels either block or let through all mouse events. " & "If mouse events are allowed to pass, you can place blended sprites above the button to change its color. " & "If mouse events are blocked, such translucent sprites provide an alternative method for disabling the button." & RETURN & RETURN & "PERMITTED MEMBER TYPES" & RETURN & "[#bitmap, #filmLoop, #flash, #movie, #picture, #quickTimeMedia, #shape, #vectorShape]" & RETURN & RETURN & "PARAMETERS:" & RETURN & "* Standard member (when mouse is elsewhere)" & RETURN & "* Rollover member" & RETURN & "* MouseDown member" & RETURN & "* Disabled member" & RETURN & RETURN & "Optional parameters:" & RETURN & "* MouseDown sound" & RETURN & "* MouseUp sound" & RETURN & "If members are placed consecutively in the cast in this order then default values can be used to create the button." & RETURN & RETURN & "* Do sprites above the button allow mouse events through?" & RETURN & "* Type of message sent on mouseUp: do | sendAllSprites | call the actorList | no action" & RETURN & "* Custom Message sent on mouseUp" & RETURN & RETURN & "NOTES:" & RETURN & "If you use 'do', be sure that you have a handler in a Movie Script that corresponds to the message sent." & RETURN & RETURN & "If you indicate 'no action' then this behavior will simply deal with the different states of the button. " & "You can still execute an action on mouseUp by one of two means:" & RETURN & "1) Add a behavior with a mouseUp handler to the same sprite (for example, the 'Jump Back Button' behavior" & RETURN & "2) Subscribe an object to the current behavior. " & " The object will then receive your Custom Message directly."
  5. end
  6.  
  7. on getBehaviorTooltip me
  8.   return "Use with graphic members." & RETURN & RETURN & "Swaps the member of the sprite according to the state of the mouse. " & "You can use this dynamic button behavior to play a brief sound on mouseDown and/or mouseUp, send out a custom message of your choice, and trigger actions of other sprites. " & "You can also use it to provide visual feedback for other behaviors on the same sprite (for example, Jump to Marker Button). " & "This behavior can also interact with custom objects."
  9. end
  10.  
  11. on beginSprite me
  12.   Initialize(me)
  13. end
  14.  
  15. on exitFrame me
  16.   if myActiveFlag then
  17.     CheckForRollover(me)
  18.   end if
  19. end
  20.  
  21. on endSprite me
  22.   call(#PushButton_ClosingDown, mySubscribersList, me, spriteNum, myMessage)
  23.   mySubscribersList.deleteAll()
  24. end
  25.  
  26. on Initialize me
  27.   mySprite = sprite(me.spriteNum)
  28.   myMember = mySprite.member
  29.   repeat while the last char in myMessage = SPACE
  30.     delete char -30000 of myMessage
  31.   end repeat
  32.   if not ["do", "no action"].getPos(myMessageType) then
  33.     if myMessage contains SPACE then
  34.       ErrorAlert(me, #spaceInMessage, myMessage)
  35.     else
  36.       myMessage = symbol(myMessage)
  37.     end if
  38.   end if
  39.   myActiveFlag = myActiveFlag = "Active"
  40.   myXRayFlag = myXRayFlag = "let all mouse events through"
  41.   myStandardMember = value(myStandardMember)
  42.   myRollovermember = value(myRollovermember)
  43.   myMouseDownMember = value(myMouseDownMember)
  44.   myDisabledMember = value(myDisabledMember)
  45.   myMouseDownSound = value(myMouseDownSound)
  46.   myMouseUpSound = value(myMouseUpSound)
  47.   if myActiveFlag then
  48.     myMember = myStandardMember
  49.     mySprite.member = myMember
  50.   else
  51.     myMember = myDisabledMember
  52.     mySprite.member = myMember
  53.   end if
  54.   mySubscribersList = []
  55.   sendAllSprites(#PushButton_OpenForBusiness, mySubscribersList, me, spriteNum, myMessage)
  56. end
  57.  
  58. on CheckForRollover me
  59.   mouseOverMe = rollover(spriteNum)
  60.   if mouseOverMe then
  61.     if not myXRayFlag then
  62.       mouseOverMe = the mouseMember = myMember
  63.     end if
  64.   end if
  65.   if myRollover = mouseOverMe then
  66.     if theMouseWasUp = the mouseUp then
  67.       exit
  68.     else
  69.       theMouseWasUp = the mouseUp
  70.       if mouseOverMe then
  71.         if the mouseUp then
  72.           if myMouseDown then
  73.             Activate(me)
  74.           else
  75.             myMember = myRollovermember
  76.             mySprite.member = myMember
  77.           end if
  78.         else
  79.           clickOn(me)
  80.         end if
  81.       else
  82.         if the mouseUp then
  83.           if myMouseDown then
  84.             Disactivate(me)
  85.           end if
  86.         end if
  87.       end if
  88.     end if
  89.   else
  90.     myRollover = mouseOverMe
  91.     if myMouseDown then
  92.       if myRollover then
  93.         myMember = myMouseDownMember
  94.         mySprite.member = myMember
  95.       else
  96.         myMember = myStandardMember
  97.         mySprite.member = myMember
  98.       end if
  99.     else
  100.       if not (the mouseDown) and myRollover then
  101.         myMember = myRollovermember
  102.         mySprite.member = myMember
  103.       else
  104.         myMember = myStandardMember
  105.         mySprite.member = myMember
  106.       end if
  107.     end if
  108.   end if
  109. end
  110.  
  111. on clickOn me
  112.   myMouseDown = 1
  113.   myMember = myMouseDownMember
  114.   mySprite.member = myMember
  115.   if not voidp(myMouseDownSound) and (myMouseDownSound <> #none) then
  116.     puppetSound(myMouseDownSound)
  117.   end if
  118.   updateStage()
  119. end
  120.  
  121. on Activate me
  122.   myMouseDown = 0
  123.   theMouseWasUp = 0
  124.   myMember = myStandardMember
  125.   mySprite.member = myMember
  126.   if not voidp(myMouseUpSound) and (myMouseUpSound <> #none) then
  127.     puppetSound(myMouseUpSound)
  128.   end if
  129.   updateStage()
  130.   case myMessageType of
  131.     "do":
  132.       do(myMessage)
  133.     "sendAllSprites":
  134.       sendAllSprites(myMessage, me, spriteNum)
  135.     "call the actorList":
  136.       call(myMessage, the actorList, me, spriteNum)
  137.   end case
  138.   call(#PushButton_Activated, mySubscribersList, me, spriteNum, myMessage)
  139. end
  140.  
  141. on Disactivate me
  142.   myMouseDown = 0
  143.   myMember = myStandardMember
  144.   mySprite.member = myMember
  145. end
  146.  
  147. on PushButton_ToggleActive me, trueOrFalse
  148.   if voidp(trueOrFalse) then
  149.     myActiveFlag = not myActiveFlag
  150.   else
  151.     case ilk(trueOrFalse) of
  152.       #integer:
  153.         myActiveFlag = trueOrFalse <> 0
  154.       otherwise:
  155.         return #invalidTypeError
  156.     end case
  157.   end if
  158.   if myActiveFlag then
  159.     myMember = myStandardMember
  160.     mySprite.member = myMember
  161.     call(#PushButton_Enabled, mySubscribersList, me, spriteNum, myMessage)
  162.   else
  163.     myMember = myDisabledMember
  164.     mySprite.member = myMember
  165.     call(#PushButton_Disabled, mySubscribersList, me, spriteNum, myMessage)
  166.   end if
  167. end
  168.  
  169. on PushButton_GetReference me, theList
  170.   case ilk(theList) of
  171.     #list:
  172.       theList.append(me)
  173.     #propList:
  174.       theList.addProp(me.spriteNum, me)
  175.     otherwise:
  176.       return me
  177.   end case
  178.   return theList
  179. end
  180.  
  181. on PushButton_Subscribe me, callingBehavior, theMessage
  182.   if not voidp(theMessage) then
  183.     if theMessage <> myMessage then
  184.       exit
  185.     end if
  186.   end if
  187.   if mySubscribersList.getPos(callingBehavior) then
  188.     exit
  189.   else
  190.     if objectp(callingBehavior) then
  191.       mySubscribersList.append(callingBehavior)
  192.       return me
  193.     end if
  194.   end if
  195. end
  196.  
  197. on PushButton_Unsubscribe me, callingBehavior
  198.   mySubscribersList.deleteOne(callingBehavior)
  199. end
  200.  
  201. on substituteStrings me, parentString, childStringList
  202.   i = childStringList.count()
  203.   repeat while i
  204.     tempString = EMPTY
  205.     dummyString = childStringList.getPropAt(i)
  206.     replacement = childStringList[i]
  207.     lengthAdjust = dummyString.char.count - 1
  208.     repeat while 1
  209.       position = offset(dummyString, parentString)
  210.       if not position then
  211.         parentString = tempString & parentString
  212.         exit repeat
  213.         next repeat
  214.       end if
  215.       if position <> 1 then
  216.         tempString = tempString & parentString.char[1..position - 1]
  217.       end if
  218.       tempString = tempString & replacement
  219.       delete parentString.char[1..position + lengthAdjust]
  220.     end repeat
  221.     i = i - 1
  222.   end repeat
  223.   return parentString
  224. end
  225.  
  226. on ErrorAlert me, theError, data
  227.   case theError of
  228.     #spaceInMessage:
  229.       if the runMode = "Author" then
  230.         behaviorName = string(me)
  231.         delete word 1 of behaviorName
  232.         delete char -30001 of behaviorName
  233.         delete char -30001 of behaviorName
  234.         terror1 = "BEHAVIOR ERROR: Frame ^0, Sprite ^1"
  235.         terror1 = substituteStrings(me, terror1, ["^0": the frame, "^1": the currentSpriteNum])
  236.         terror2 = "Behavior ^0"
  237.         terror2 = substituteStrings(me, terror2, ["^0": behaviorName])
  238.         terror3 = "This message includes spaces: ^0"
  239.         terror3 = substituteStrings(me, terror3, ["^0": QUOTE & data & QUOTE])
  240.         terror4 = "Only the first word will be used in sendAllSprite calls."
  241.         alert(terror1 & RETURN & RETURN & terror2 & RETURN & RETURN & terror3 & RETURN & RETURN & terror4)
  242.       end if
  243.   end case
  244. end
  245.  
  246. on isOKToAttach me, aSpriteType, aSpriteNum
  247.   tisok = 0
  248.   if aSpriteType = #graphic then
  249.     if PermittedMemberTypes().getOne(sprite(aSpriteNum).member.type) > 0 then
  250.       tisok = 1
  251.     end if
  252.   end if
  253.   return tisok
  254. end
  255.  
  256. on getPropertyDescriptionList me
  257.   theMember = sprite(the currentSpriteNum).member
  258.   memberType = theMember.type
  259.   permittedTypes = PermittedMemberTypes(me)
  260.   theMemberNum = theMember.number
  261.   suitableMembersList = GetSuitableMembers(me, permittedTypes)
  262.   descriptionList = [#myStandardMember: [#comment: "- GRAPHICS - Standard member for sprite", #format: #member, #range: suitableMembersList, #default: theMember], #myRollovermember: [#comment: "Rollover member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum + 1)], #myMouseDownMember: [#comment: "MouseDown member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum + 2)], #myDisabledMember: [#comment: "Disabled member", #format: #member, #range: suitableMembersList, #default: member(theMemberNum + 3)]]
  263.   soundsAvailable = GetSuitableMembers(me, [#sound])
  264.   if soundsAvailable.count() then
  265.     soundsAvailable.addAt(1, #none)
  266.     descriptionList.addProp(#myMouseDownSound, [#comment: "- SOUNDS - Sound to play on mouseDown", #format: #sound, #range: soundsAvailable, #default: member(theMemberNum + 4)])
  267.     descriptionList.addProp(#myMouseUpSound, [#comment: "Sound to play on mouseUp", #format: #sound, #range: soundsAvailable, #default: member(theMemberNum + 5)])
  268.   end if
  269.   descriptionList.addProp(#myActiveFlag, [#comment: "- INTERACTION - Button is initially", #format: #string, #range: ["Active", "Inactive"], #default: "Active"])
  270.   descriptionList.addProp(#myXRayFlag, [#comment: "Sprites which cover the button", #format: #string, #range: ["block all mouse events", "let all mouse events through"], #default: 0])
  271.   descriptionList.addProp(#myMessageType, [#comment: "Action on mouseUp", #format: #string, #range: ["do", "sendAllSprites", "call the actorList", "no action"], #default: "sendAllSprites"])
  272.   descriptionList.addProp(#myMessage, [#comment: EMPTY, #format: #string, #default: "YourCustomMessage"])
  273.   return descriptionList
  274. end
  275.  
  276. on GetSuitableMembers me, permittedTypes
  277.   cursor(4)
  278.   suitableMembersList = []
  279.   maxCastLib = the number of castLibs
  280.   repeat with theCastLib = 1 to maxCastLib
  281.     maxMember = the number of castMembers of castLib theCastLib
  282.     repeat with memberNumber = 1 to maxMember
  283.       theMember = member(memberNumber, theCastLib)
  284.       if permittedTypes.getPos(theMember.type) then
  285.         if theMember.name = EMPTY then
  286.           suitableMembersList.append(theMember)
  287.           next repeat
  288.         end if
  289.         suitableMembersList.append(theMember.name)
  290.       end if
  291.     end repeat
  292.   end repeat
  293.   cursor(-1)
  294.   return suitableMembersList
  295. end
  296.  
  297. on PermittedMemberTypes me
  298.   return [#bitmap, #filmLoop, #flash, #movie, #picture, #quickTimeMedia, #shape, #vectorShape]
  299. end
  300.